import java.util.ArrayList;
import java.util.List;

/**
 * @Author: linzp
 * @Date: 2022/07/12/14:42
 */
public class demo0712 {
    public static void main(String[] args) {

    }

    /**
     * 59. 螺旋矩阵 II
     * 给你一个正整数 n ，生成一个包含 1 到 n2 所有元素，且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
     * <p>
     * <p>
     * 示例 1：
     * <p>
     * <p>
     * 输入：n = 3
     * 输出：[[1,2,3],[8,9,4],[7,6,5]]
     * 示例 2：
     * <p>
     * 输入：n = 1
     * 输出：[[1]]
     * <p>
     * <p>
     * 提示：
     * <p>
     * 1 <= n <= 20
     */

    public int[][] generateMatrix(int n) {
        //n=3为例
        int up = 0, right = n - 1, down = n - 1, left = 0;//对应上右下左4条边 并且初始化为开始时的位置
        int count = 1;
        int[][] res = new int[n][n];
        while (count <= n * n) {
            for (int i = left; i <= right; i++) { //00 01 02 左边往右边靠 保持左开右闭
                res[up][i] = count++;
            }
            up++;
            for (int i = up; i <= down; i++) { //12 22 上边往下靠
                res[i][right] = count++;
            }
            right--;
            for (int i = right; i >= left; i--) { //21 20 右边往左边靠
                res[down][i] = count++;
            }
            down--;
            for (int i = down; i >= up; i--) { // 10
                res[i][left] = count++;
            }
            left++;
        }
        return res;
    }

    /**
     * 给你一个 m 行 n 列的矩阵 matrix ，请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素。
     * <p>
     *  
     * <p>
     * 示例 1：
     * <p>
     * <p>
     * 输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
     * 输出：[1,2,3,6,9,8,7,4,5]
     * 示例 2：
     * <p>
     * <p>
     * 输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
     * 输出：[1,2,3,4,8,12,11,10,9,5,6,7]
     * <p>
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/spiral-matrix
     * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     */
    public List<Integer> spiralOrder(int[][] matrix) {

        int up = 0, right = matrix[0].length - 1, down = matrix.length - 1, left = 0;//对应上右下左4条边 并且初始化为开始时的位置
        int count = matrix.length * matrix[0].length;//总数
        List<Integer> res = new ArrayList<>();
        while (count >= 1) {
            for (int i = left; i <= right && count >= 1; i++) { //00 01 02 左边往右边靠 保持左开右闭
                res.add(matrix[up][i]);//&&count >= 1;for循环中也要判断，因为不是n*n的矩阵不会达到最后一个点时上下左右全部相等的情况 这时下一个for循环就会继续走下去
                count--;
            }
            up++;
            for (int i = up; i <= down && count >= 1; i++) { //12 22 上边往下靠
                res.add(matrix[i][right]);
                count--;
            }
            right--;
            for (int i = right; i >= left && count >= 1; i--) { //21 20 右边往左边靠
                res.add(matrix[down][i]);
                count--;
            }
            down--;
            for (int i = down; i >= up && count >= 1; i--) { // 10
                res.add(matrix[i][left]);
                count--;
            }
            left++;
        }
        return res;
    }
}
